from rest_framework import serializers
from django_redis import get_redis_connection
from redis import RedisError
import logging

class ImageCodeCheckSerializer(serializers.Serializer):
    # 定义待校验的字典：定义的字段名字，必须和外界传入的一致
    image_code_id = serializers.UUIDField()
    text = serializers.CharField(max_length=4, min_length=4)

    def validate(self, attrs):
        # 因为定义字段时，会进行初步验证，验证结果会保存在attrs字典中，所以要从attrs中取值。
        image_code_id = attrs["image_code_id"]
        text = attrs["text"]

        # 链接redis数据库，获取reids中的text
        redis_conn = get_redis_connection("verify_codes")
        image_code_server = redis_conn.get("img_%s" % image_code_id)

        if image_code_server is None:
            raise serializers.ValidationError("无效验证码")

        # 对比传入的验证码和redis数据库中的一致性
        # 因为py3中redis存储数据的类型都是bytes，而在读取时也是bytes类型的，因为速度快
        image_code_server = image_code_server.decode()



        # 在获取到image_code_server之后，在比对之前
        # 删除redis图片验证码，防止暴力测试
        try:
            redis_conn.delete("img_%s" % image_code_id)
        except RedisError as e:
            logging.error(e)



        if text.lower() != image_code_server.lower():
            raise serializers.ValidationError("")

        # 校验60s内是否重复发送短信验证码
        mobile = self.context["view"].kwargs["mobile"]
        send_flag = redis_conn.get("send_flag_%s" % mobile)
        if send_flag:
            raise serializers.ValidationError("发送短信验证码过于频繁")

        return attrs

